/******************************************************************************
 * Qwt Widget Library
 * Copyright (C) 1997   Josef Wilgen
 * Copyright (C) 2002   Uwe Rathmann
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the Qwt License, Version 1.0
 *****************************************************************************/

#ifndef QWT_PLOT_PICKER_H
#define QWT_PLOT_PICKER_H

#include "qwt_global.h"
#include "qwt_picker.h"
#include "qwt_axis_id.h"

class QwtPlot;
class QPointF;
class QRectF;

#if QT_VERSION < 0x060000
template<typename T>
class QVector;
#endif

/*!
   \brief QwtPlotPicker provides selections on a plot canvas

   QwtPlotPicker is a QwtPicker tailored for selections on
   a plot canvas. It is set to a x-Axis and y-Axis and
   translates all pixel coordinates into this coordinate system.
 */

class QWT_EXPORT QwtPlotPicker : public QwtPicker
{
  Q_OBJECT

public:
  explicit QwtPlotPicker(QWidget *canvas);
  virtual ~QwtPlotPicker();

  explicit QwtPlotPicker(QwtAxisId xAxisId, QwtAxisId yAxisId, QWidget *);

  explicit QwtPlotPicker(QwtAxisId xAxisId, QwtAxisId yAxisId,
                         RubberBand rubberBand, DisplayMode trackerMode,
                         QWidget *);

  virtual void setAxes(QwtAxisId xAxisId, QwtAxisId yAxisId);

  QwtAxisId xAxis() const;
  QwtAxisId yAxis() const;

  QwtPlot *plot();
  const QwtPlot *plot() const;

  QWidget *canvas();
  const QWidget *canvas() const;

Q_SIGNALS:

  /*!
     A signal emitted in case of QwtPickerMachine::PointSelection.
     \param pos Selected point
   */
  void selected(const QPointF &pos);

  /*!
     A signal emitted in case of QwtPickerMachine::RectSelection.
     \param rect Selected rectangle
   */
  void selected(const QRectF &rect);

  /*!
     A signal emitting the selected points,
     at the end of a selection.

     \param pa Selected points
   */
  void selected(const QVector<QPointF> &pa);

  /*!
     A signal emitted when a point has been appended to the selection

     \param pos Position of the appended point.
     \sa append(). moved()
   */
  void appended(const QPointF &pos);

  /*!
     A signal emitted whenever the last appended point of the
     selection has been moved.

     \param pos Position of the moved last point of the selection.
     \sa move(), appended()
   */
  void moved(const QPointF &pos);

protected:
  QRectF scaleRect() const;

  QRectF invTransform(const QRect &) const;
  QRect transform(const QRectF &) const;

  QPointF invTransform(const QPoint &) const;
  QPoint transform(const QPointF &) const;

  virtual QwtText trackerText(const QPoint &) const QWT_OVERRIDE;
  virtual QwtText trackerTextF(const QPointF &) const;

  virtual void move(const QPoint &) QWT_OVERRIDE;
  virtual void append(const QPoint &) QWT_OVERRIDE;
  virtual bool end(bool ok = true) QWT_OVERRIDE;

private:
  class PrivateData;
  PrivateData *m_data;
};

#endif
